// 云函数入口文件,引入云函数skd
const cloud = require('wx-server-sdk')

// 云函数初始化，必须放在第一个执行
cloud.init({
  // API 调用都保持和云函数当前所在环境一致
  env: cloud.DYNAMIC_CURRENT_ENV
})

// 引入数据库实例
const db = cloud.database()
const comm = db.command
const MAX_LIMIT = 100

// 分页查询产品
async function queryProductPage(args) {
  let pageNo = args.pageNo - 1;
  let pageSize = args.pageSize;
  // 先取出集合记录总数
  const countResult = await db.collection('product').count()
  const total = countResult.total
  // 计算页数
  const totalPage = Math.ceil(total / 20)
  // 查询当前页的数据
  const list = await db.collection('product').skip(pageNo * pageSize).limit(pageSize).get()
  // 返回结果
  return {
    count: total,
    totalPage: totalPage,
    list: list.data
  }
}

async function queryListAll(args) {
  let where = {};
  if(!args.isAdmin) {
    where.status = '已上架';
  }
  // 先取出集合记录总数
  const countResult = await db.collection('product').where(where).count()
  
  const total = countResult.total
  // 计算需分几次取
  const batchTimes = Math.ceil(total / 100)
  // 承载所有读操作的 promise 的数组
  const tasks = []
  for (let i = 0; i < batchTimes; i++) {
    const promise = db.collection('product').where(where).skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
    tasks.push(promise)
  }
  if(tasks.length === 0) {
    return {
      list: [],
      count: 0,
      errMsg: 'ok',
    }
  }
  // 等待所有
  return (await Promise.all(tasks)).reduce((acc, cur) => {
    return {
      count: total,
      totalPage: batchTimes,
      list: acc.data.concat(cur.data)
    }
  })
}

// 根据类目分页查询产品
async function findPageByCategory(args) {
  let pageNo = args.pageNo - 1;
  let pageSize = args.pageSize;
  let category = args.category;
  // 先取出集合记录总数
  const countResult = await db.collection('product').where({
    category: comm.eq(category)
  }).count()
  const total = countResult.total
  // 计算页数
  const totalPage = Math.ceil(total / 20)
  // 查询当前页的数据
  const list = await db.collection('product').where({
    category: comm.eq(category)
  }).skip(pageNo * pageSize).limit(pageSize).get()
  // 返回结果
  return {
    count: total,
    totalPage: totalPage,
    list: list.data
  }
}

// 查询产品详细通过_id
async function queryProductById(id) {
  const res = await db.collection("product").doc(id).get();
  return res.data;
}

// 保存产品，存在_id则修改，不存在则新增
async function save(args) {
  let res = {};
  if(args._id) {
    // 修改产品信息
    const id = args._id;
    delete args._id;
    res = await db.collection("product").doc(id).update({
      data: args
    });
  }else {
    // 新增产品信息
    res = await db.collection('product').add({
      // data 字段表示需新增的 JSON 数据
      data: args
    });
  }
  return res;
}

// 删除产品，通过_id
async function deleteProduct(id) {
  return await db.collection("product").doc(id).remove();
}

// 根据产品名称搜索商品
async function queryProductByLikeName(name) {
  name = '.*' + name;
  return await db.collection("product").where({
    name: {
      $regex: name,
      $options: 'i'
    }
  }).get();
}

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  const {method, args} = event;
  let res = {};
  if(method === "findPageByCategory") {
    res = await findPageByCategory(args);
  }else if(method === 'save') {
    res = await save(args);
  }else if(method === "deleteProduct") {
    res = await deleteProduct(args._id);
  }else if(method === "queryProductById") {
    res = await queryProductById(args._id);
  }else if(method === "queryProductPage") {
    res = await queryListAll(args);
  }else if(method === 'queryProductByLikeName') {
    res = await queryProductByLikeName(args.name);
  }
  return {
    rstData: res,
    openid: wxContext.OPENID,
    appid: wxContext.APPID,
    unionid: wxContext.UNIONID
  }
}